import threading
import time
import os

# 线程同步方法：
# 1.join
# 2.互斥锁

# 线程之间共享全局变量
val = 0


# 创建互斥锁，Lock本质上是一个函数，通过调用函数可创建一个互斥锁
lock = threading.Lock()


def dance():
    # 上锁
    lock.acquire()
    for i in range(3):
        print('跳舞线程')
        global val
        val += 1
        print('跳舞线程value值：', val)
        time.sleep(0.2)
    # 释放锁(如果不释放锁就会出现死锁)
    lock.release()


def sing():
    # 上锁
    lock.acquire()
    for i in range(3):
        print('唱歌线程')
        global val
        val += 1
        print('唱歌线程value值：', val)
        time.sleep(0.2)
    # 释放锁(如果不释放锁就会出现死锁)
    lock.release()

if __name__ == '__main__':
    # group线程组目前只能写None,省略不写就是None
    # target是线程要执行的任务
    # name如果不指定线程名字就会自动为Threed-1...
    dance_threed = threading.Thread(target=dance)
    sing_threed = threading.Thread(target=sing)

    dance_threed.start()
    # 线程等待，让跳舞线程先执行完后，再执行唱歌线程，保证数据不会有问题
    # dance_threed.join()
    sing_threed.start()


# 线程之间执行是无序的，顺序由cpu调度来决定
# 互斥锁听以保证同一时刻只有一个线程去执行代码﹐能够保证全局变量的数据没有问题
# 线程等待和互斥锁都是把多任务改成单任务去执行﹐保证了数据的准确性﹐但是执行性能会下降

